﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DOMINIO;
using DAL.ConexionBD;
using System.Data.SqlClient;
using System.Data;

namespace DAL
{
    public class DetallePedidoDAL
    {
        private SqlConnection cnn;

        public void Detalle(List<DetallePedido> detalle, int IdPedido)
        {
            foreach (DetallePedido d in detalle)
            {
                d.IdPedido = IdPedido;
                Guardar(d);
            }
        }

        public void Guardar(DetallePedido detalle)
        {
            cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
            SqlCommand cmd = new SqlCommand("PA_registrarDetallePedido", cnn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@Cantidad", detalle.Cantidad);
            cmd.Parameters.AddWithValue("@Precio", detalle.Precio);
            cmd.Parameters.AddWithValue("@IdProducto", detalle.IdProducto);
            cmd.Parameters.AddWithValue("@IdPedido", detalle.IdPedido);
            cmd.Parameters.AddWithValue("@Activo", detalle.Activo);

            try
            {
                cnn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new Exception("Error SQL: " + ex.Message);
            }
            cnn.Close();
        }

        public void DeleteDetallePedido(DetallePedido detalle)
        {
            cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
            SqlCommand cmd = new SqlCommand("PA_DeleteDetallePedido", cnn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@IdPedido", detalle.IdPedido);
            cmd.Parameters.AddWithValue("@IdProducto", detalle.IdProducto);

            try
            {
                cnn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new Exception("Error SQL: " + ex.Message);
            }
            cnn.Close();
        }

        public List<DetallePedido> BuscarDetallePorIdPedido(int Id)
        {
            cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
            SqlCommand cmd = new SqlCommand("PA_BuscarDetallePorIdPedido", cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Id", Id);

            return SelectFactory(cnn, cmd);
        }

        private static List<DetallePedido> SelectFactory(SqlConnection cnx, SqlCommand cmd)
        {
            cnx.Open();

            SqlDataReader DR = cmd.ExecuteReader();
            List<DetallePedido> ListaDetallePedido = new List<DetallePedido>();

            while (DR.Read())
            {
                DetallePedido detallePedido = new DetallePedido();
                ProductoDAL prodDAL = new ProductoDAL();

                detallePedido.IdProducto = DR.GetInt32(0);
                detallePedido.IdPedido = DR.GetInt32(1);
                detallePedido.Cantidad = DR.GetDecimal(2);
                detallePedido.Precio = DR.GetDecimal(3);
                detallePedido.Activo = DR.GetBoolean(4);

                detallePedido.ProductoA = prodDAL.BuscarProductoPorCodigo(detallePedido.IdProducto);

                ListaDetallePedido.Add(detallePedido);
            }
            cnx.Close();
            return ListaDetallePedido;
        }
    }
}
